<?php

// Acceso restringido
defined('JL') or die('Acceso restringido');


/* include ('Config.class.php');
  include ('SPDO.class.php');

  // Configuracion de Base de Datos
  $config = Config::getInstance();
  $config->set('dbHost', 'localhost');
  $config->set('dbName', 'labolsa1_dbcsme');
  $config->set('dbUser', 'labolsa1_usercsm');
  $config->set('dbPass', 'NSyKL85q92gv'); */

/**
 * Clase de Base de Datos
 * @property PDO $_db
 * @property JLDatataBase $instance
 */
class JLDatataBase {

    private $_db = null;
    private static $instance = null;
    private $affectedRows = 0;
    private $insertId = 0;
    // Variable que almacena el Recurso generado por la funcion executeQuery.
    private $result = null;
    private $datos = null;

    function __construct() {
        // Crea una instacion de la clase SPDO extendida
        $this->_db = SPDO::singleton();
    }

    /**
     * Crea la Instancia Unica de la clase DatataBase. (Singleton)
     * @Params no
     * @Return 
      . */
    public static function getInstance() {
        if (self::$instance == null) {
            self::$instance = new self();
        }

        return self::$instance;
    }

    /**
     * Executa una sentencia SQL.
     * @Params $sql[String] Cadena de consulta SQL.
     * @Return no [para retornar use: getDataArray o getDataObject]
     */
    public function executeQuery($sql) {
        $this->result = $this->_db->query($sql);
        $this->insertId = $this->_db->lastInsertId();
        $this->affectedRows = $this->result->rowCount();
    }

    /**
     * @return PDO
     */
    public function getDbh() {
        return $this->_db;
    }

    /**
     * Retorna los resultados como Arrays Asociativos.
     * @Params no
     * @Return Arrays
     */
    public function getDataArray() {
        $this->defineReturn(1);
        return $this->datos;
    }

    /**
     * Retorna los resultados como Objetos.
     * @Params no
     * @Return Objects
     */
    public function getDataObject() {
        $this->defineReturn();
        return $this->datos;
    }

    /**
     * define el tipo de datos de retorno.
     * @Params $returntype[Int] tipo de retorno.
     * @Return no
     */
    private function defineReturn($returntype = 0) {
        $mydata = array();
        $i = 0;

        switch ($returntype) {
            case 1:
                // ARRAY
                while ($obj = $this->result->fetch(PDO::FETCH_ASSOC)) {
                    $mydata[$i] = $obj;
                    $i++;
                }
                break;

            default:
                // OBJECTS
                while ($obj = $this->result->fetch(PDO::FETCH_OBJ)) {
                    $mydata[$i] = $obj;
                    $i++;
                }
                break;
        }

        switch ($i) {
            case 0:
                $data = null;
                break;

            /* case 1:
              $data = $mydata[0];
              break; */

            default:
                $data = $mydata;
                break;
        }

        $this->datos = $data;
    }

    /**
     * Retorna el valor del campo ID auto_increment de una consulta de Insercion.
     * @Params no
     * @Return Int
     */
    public function getInsertedId() {
        return intval(trim($this->insertId));
    }

    /**
     * Retorna el numero de registros afectados.
     * @Params no
     * @Return Int
     */
    public function getRowsAffected() {
        if ($this->affectedRows < 0)
            $this->affectedRows = 0;
        return intval($this->affectedRows);
    }

    /**
     * Begin a Transaction
     * @Params no
     * @Return Bool
     */
    public function dataBeginTransaction() {
        return $this->_db->beginTransaction();
    }

    /**
     * Commits a transaction
     * @Params no
     * @Return Bool
     */
    public function dataCommit() {
        return $this->_db->commit();
    }

    /**
     * Rolls back a transaction 
     * @Params no
     * @Return Bool
     */
    public function dataRollBack() {
        return $this->_db->rollBack();
    }

    /**
     * Get a quoted database escaped string
     *
     * @param	string	A string
     * @return	string
     * @access public
     */
    public function Quote($text) {
        return "'" . str_replace("'", "\'", str_replace('\\', '', $text)) . "'";
    }

}